<?php
/**
 * 文件路径： \app\common\job\AddPersonMessage.php
 * 这是一个消费者类，用于处理 yuJobQueue 队列中的任务
 */
namespace app\common\job;


//use app\common\library\YuUtil;
use think\queue\Job;


class AddPersonScore  {

    /**
     * fire方法是消息队列默认调用的方法
     * @param Job $job 当前的任务对象
     * @param array|mixed $data 发布任务时自定义的数据
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function fire(Job $job,$data){
        // 如有必要,可以根据业务需求和数据库中的最新数据,判断该任务是否仍有必要执行.
        $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
        if(!$isJobStillNeedToBeDone){
            $job->delete();
            return;
        }

        $isJobDone = $this->doYuAction($data);

        //(思考)任务成功要删除任务，任务重试多次之后，无论成功和失败都要删除任务
        if ($isJobDone) {
            //如果任务执行成功， 记得删除任务
            $job->delete();
            print("<info>AddPersonScore Job has been done and deleted"."</info>\n");
        }else{
            //（思考）如果在开启后台任务执行时，没有输入重试次数，就会走到这个方法控制重试次数！！
            if ($job->attempts() > 3) {
                //通过这个方法可以检查这个任务已经重试了几次了
                print("<warn>AddPersonScore Job has been retried more than 3 times!"."</warn>\n");
                $job->delete();
                // 也可以重新发布这个任务
                //print("<info>Hello Job will be availabe again after 2s."."</info>\n");
                //$job->release(2); //$delay为延迟时间，表示该任务延迟2秒后再执行
            }
        }

    }

    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param array|mixed    $data     发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    private function checkDatabaseToSeeIfJobNeedToBeDone($data){
        return true;
    }

    /**
     * 根据消息中的数据进行实际的业务处理
     * @param array|mixed $data 发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    public function doYuAction($data){
        print("<info>AddPersonScore Job Started. job Data is: ".var_export($data,true)."</info> \n");
        print("<info>AddPersonScore Job is Fired at " . date('Y-m-d H:i:s') ."</info> \n");
        $uid = $data['uid'];
        $score =$data['score'];
        $re= \app\common\library\YuAccount::addScore($uid,$score);
        if ($re->getStatus()){
            //任务执行成功
            print(date('Y-m-d H:i:s')."<info> AddPersonScore Job is Done!"."</info> \n");
            return true;
        }else{
            //任务执行失败！
            print(date('Y-m-d H:i:s')."<info> AddPersonScore Job is failed!"."</info> \n");
            return false;
        }
    }

    /**
     * 该方法用于接收任务执行失败的通知，你可以发送邮件给相应的负责人员
     * @param $data  string|array|...      //发布任务时传递的 $data 数据
     * @throws \HttpException
     * @throws \HttpResponseException
     */
    public function failed($data){
        ly(object_array($data),'AddPersonScore_failed-'.time());
//        print("Warning: Job failed after max retries. job data is :var_export($data,true)\n");
    }


}